<?php

/**
 * @author    1054229380@qq.com
 * @since    2017-7-3
 * @desc 字符串处理类
 * */
class str
{

    /**
     * 检测电子邮箱是否合法
     * */
    public static function isEmail($email)
    {
        $mode = "/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/";
        if (preg_match($mode, $email)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断是否为日期
     * */
    public static function isDate($str, $format = "Y-m-d")
    {
        $unixTime_1 = strtotime($str);
        if (!is_numeric($unixTime_1))
            return false;
        $checkDate = date($format, $unixTime_1);
        $unixTime_2 = strtotime($checkDate);;
        if ($unixTime_1 == $unixTime_2) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断字符是否为纯数字
     * */
    public static function isNum($str)
    {
        if (preg_match('[0-9]', $str)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断字符是否为汉字
     * */
    public static function isCN($str)
    {
        if (preg_match('[' . chr(0xa1) . '-' . chr(0xff) . ']', $str)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断字符是否为英文字母
     * */
    public static function isEN($str)
    {
        if (preg_match('[a-zA-Z]', $str)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断是否允许字符,当前为判断允许汉字，数字，英文和下划线
     * @param 源字符串 :$str
     */
    private static function isAllowString($str)
    {
        $isAllow = false;

        if ($str == "_" || is_numeric($str) || self::isCN($str) || self::isEN($str)) {
            return true;
        }
        return $isAllow;
    }

    /**
     * 判断手机号码正误
     * */
    public static function isMobile($str)
    {
        if (preg_match("/^1[34578]{1}\d{9}$/", $str)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断是否合法合用户名,只允许汉字，数字，英文和下划线
     * @param 源字符串 :$str
     */
    public static function checkAllowUserName($str)
    {
        if ($str == "") {//不允许为空
            return false;
        }
        $chrNum = self::strlen_utf8($str); //字符个数，汉字表示一个字符
        if ($chrNum < 2 || $chrNum > 16) {//允许2-16位字符组成
            return false;
        }
        $firstChr = substr($str, 0, 1);
        if (self::isNum($firstChr)) {//不能以数字和_开头,须是英文字母和汉字开头
            //return false;
        }

        for ($i = 0; $i < strlen($str); $i++) {
            $tempStr = substr($str, $i, 1);
            $chr = ord($tempStr);
            if ($chr & 0x80) {
                $tempStr = substr($str, $i, 3);
                $i = $i + 2;
            } else {
                $tempStr = substr($str, $i, 1);
            }
            if (!self::isAllowString($tempStr)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 获取字符个数，一个汉字表示一个
     * @param 源字符串 :$str
     */
    public static function strlen_utf8($str)
    {
        $i = 0;
        $count = 0;
        $len = strlen($str);
        while ($i < $len) {
            $chr = ord($str[$i]);
            $count++;
            $i++;
            if ($i >= $len)
                break;
            if ($chr & 0x80) {
                $chr <<= 1;
                while ($chr & 0x80) {
                    $i++;
                    $chr <<= 1;
                }
            }
        }
        return $count;
    }

    /**
     * 检测字符串中是否存在指定字符
     * @param 源字符串 :$str
     * @param 含有关键字 :$keywords
     */
    public static function isStrExist($str, $keywords)
    {
        if (is_int(strpos($str, $keywords))) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 设置安全字符规则
     * @param str
     * @return string
     * */
    public static function getSafeData($str)
    {
        $str = strip_tags($str);
        $str = str_replace('\"', '&quot;', $str);
        $str = str_replace('\'', '&#039;', $str);
        $str = str_replace('<', '&lt;', $str);
        $str = str_replace('>', '&gt;', $str);
        $str = str_replace('#amp;', '&', $str);
        $str = str_replace('{@#}', '%', $str);
        $str = addslashes($str);
        return $str;
    }

    /**
     * 数组递归转化
     * */
    private static function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
    {
        static $recursive_counter = 0;
        if (++$recursive_counter > 1000) {
            die('possible deep recursion attack');
        }
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                self::arrayRecursive($array[$key], $function, $apply_to_keys_also);
            } else {
                $value = str_replace("\"", "\\\"", $value);
                $value = str_replace(chr(10), "", $value);
                $value = str_replace(chr(13), "", $value);
                $array[$key] = $function($value);
            }
            if ($apply_to_keys_also && is_string($key)) {
                $new_key = $function($key);
                if ($new_key != $key) {
                    $array[$new_key] = $array[$key];
                    unset($array[$key]);
                }
            }
        }
        $recursive_counter--;
    }

    /**
     * 转换数组为JSON格式
     * @param 数组 :$arr
     * */
    public static function convertArrayToJson($arr)
    {
        self::arrayRecursive($arr, 'urlencode', true);
        $json = json_encode($arr);
        return urldecode($json);
    }

    /**
     * 截取字符串
     * @param 源字符串 :str
     * @param 开始位置 :from
     * @param 结束位置 :len
     */
    public static function getCutStr($str, $from, $len)
    {
        $s = null;
        preg_match_all('#(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+)#s', $str, $array, PREG_PATTERN_ORDER);
        $from1 = 0;
        $len1 = 0;
        foreach ($array[0] as $key => $val) {
            $n = ord($val) >= 128 ? 2 : 1;
            $from1 += $n;
            if ($from1 > $from) {
                $len1 += $n;
                if ($len1 <= $len) {
                    $s .= $val;
                } else {
                    return $s . '..';
                }
            }
        }
        return $s;
    }

}

?>